﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;
using UtilityExtensions;
using System.Data;
using System.IO;
using System.Configuration;
using System.Transactions;
using System.Data.Linq;
using System.ComponentModel;

namespace BOL.Compras
{
  
      public class GetOrdenCompraItemExcel
      {

          public GetOrdenCompraItemExcel()
            {
                bol = new OrdenCompraBL();
                emp = new EmpleadoBL();
            }


          private OrdenCompraBL bol ;
          private  EmpleadoBL emp;

          int _count;


           public int Count(int idInsumo, int startRowIndex, int maximumRows, string sortExpression)
          {
              return _count;
          }

          public int Count(int idObra, int idClase, int idFamilia, int idSubFamilia, int anio, int mes)
          {
              return _count;
          }


          private IQueryable<OrdenCompraItemExcel> ApplySelect_ListInfo()
          {

              Menu ProveedorRead = DbUtil.Db.Menus.Single(p => p.idInternal == 112);
              Menu InsumoRead = DbUtil.Db.Menus.Single(p => p.idInternal == 123);
              DAL.Menu ordenCompraaRead = DbUtil.Db.Menus.Single(p => p.idInternal == 106);
              DAL.Menu gastoObraRead = DbUtil.Db.Menus.Single(p => p.idInternal == 107);

              var q = from a in DbUtil.Db.OrdenCompraItems
                      where a.bitActivo == true
                      select new OrdenCompraItemExcel
                      {
                           idInternal=a.idInternal,
                            idTipo=a.OrdenCompra.idTipoOrden.Value,
                            obra=a.OrdenCompra.Obra.descripcion,
                            idObra=a.OrdenCompra.idObra.Value,
                            autorizado=a.OrdenCompra.Empleado1.descripcion,
                            clase=a.Insumo.Insumo1.Insumo1.Insumo1.descripcion,
                            familia=a.Insumo.Insumo1.Insumo1.descripcion,
                            subFamilia=a.Insumo.Insumo1.descripcion,
                            codigo=a.Insumo.codigo,
                            descripcion=a.Descripcion,
                            estructuraCosto=a.OrdenCompra.EstructuraCosto.descripcion,
                             fecha=a.OrdenCompra.fechaEmision.Value,
                              cantidad=a.cantidad.Value,
                            numDocumentoStr = String.Format("{0}-{1}", a.OrdenCompra.TipoOrden.simbol, a.OrdenCompra.numDocumento),
                             numDocumento = a.OrdenCompra.numDocumento,
                             proveedor=a.OrdenCompra.proveedor,
                             ruc=a.OrdenCompra.docProveedor,
                             tipoCambio=a.OrdenCompra.tipoCambio.Value,
                             totalSinIGV = a.subMonto.Value * a.OrdenCompra.tipoCambio.Value,
                             totalConIGV = a.subMontoIGV.Value * a.OrdenCompra.tipoCambio.Value,
                             precioSinIGV=a.precioNoIGV.Value*a.OrdenCompra.tipoCambio.Value, ///soles
                             precioConIGV = a.precioInclIGV.Value * a.OrdenCompra.tipoCambio.Value,    ///soles
                                                                                                       ///
                             unidad=a.unidad,
                             idClase=a.Insumo.Insumo1.Insumo1.Insumo1.idInternal,
                             idFamilia=a.Insumo.Insumo1.Insumo1.idInternal,
                             idSubFamilia=a.Insumo.Insumo1.idInternal,
                             idProveedor=a.OrdenCompra.idProveedor.Value,
                             idEstructura=a.OrdenCompra.idEstructuraCompras.Value,
                             idInsumo=a.idInsumo.Value,
                             formularioProveedor = string.Format("javascript:loadTabFromForm('tab{0}','{1}','{2}?id={3}');",
                                         ProveedorRead.idAplicacion,
                                         ProveedorRead.Aplicacion.title,
                                         ProveedorRead.url,
                                         a.OrdenCompra.Proveedor1.idInternal),

                            formularioInsumo = string.Format("javascript:loadTabFromForm('tab{0}','{1}','{2}?id={3}');",
                                        InsumoRead.idAplicacion,
                                        InsumoRead.Aplicacion.title,
                                        InsumoRead.url,
                                        a.idInsumo),

                           formularioOrden = string.Format("javascript:loadTabFromForm('tab{0}-{1}','{2}','{3}?id={4}&idObra={1}');",
                                    ordenCompraaRead.idAplicacion,
                                    a.OrdenCompra.idObra,
                                    a.OrdenCompra.Obra.descripcion,
                                    (a.OrdenCompra.idTipoOrden > 1 ? gastoObraRead.url : ordenCompraaRead.url),
                                    a.idOrdenCompra),
                          //-------------------------------


                             };
              return q;






          }


          private IQueryable<OrdenCompraItemExcel> ApplySort(IQueryable<OrdenCompraItemExcel> q, string sortExpression)
          {
              switch (sortExpression)
              {
                  case "numDocumento":
                      q = q.OrderBy(b => b.numDocumento);
                      break;
                  case "numDocumento DESC":
                      q = q.OrderByDescending(b => b.numDocumento);
                      break;
                  case "fecha":
                      q = q.OrderBy(p => p.numDocumento).OrderBy(b => b.fecha);
                      break;
                  case "fecha DESC":
                      q = q.OrderByDescending(p => p.numDocumento).OrderByDescending(b => b.fecha);
                      break;
                  case "proveedor":
                      q = q.OrderBy(b => b.proveedor);
                      break;
                  case "proveedor DESC":
                      q = q.OrderByDescending(b => b.proveedor);
                      break;

                  case "totalConIGV":
                      q = q.OrderBy(b => b.totalConIGV);
                      break;
                  case "totalConIGV DESC":
                      q = q.OrderByDescending(b => b.totalConIGV);
                      break;


                  case "totalSinIGV":
                      q = q.OrderBy(b => b.totalSinIGV);
                      break;
                  case "totalSinIGV DESC":
                      q = q.OrderByDescending(b => b.totalSinIGV);
                      break;

                  case "unidad":
                      q = q.OrderBy(b => b.unidad);
                      break;
                  case "unidad DESC":
                      q = q.OrderByDescending(b => b.unidad);
                      break;

                  case "obra":
                      q = q.OrderBy(b => b.obra);
                      break;
                  case "obra DESC":
                      q = q.OrderByDescending(b => b.obra);
                      break;
                  default:
                      q = q.OrderByDescending(p => p.numDocumento).OrderByDescending(b => b.fecha);
                      break;
              }
              return q;
          }

          [DataObjectMethod(DataObjectMethodType.Select, false)]
          public IEnumerable<OrdenCompraItemExcel> Execute(int idObra,int idClase, int idFamilia, int idSubFamilia,int anio,int mes)
          {


              var q = ApplySelect_ListInfo();
              q = q.Where(a => a.idObra == idObra
                                & (idClase==0? a.idClase!=idClase:a.idClase==idClase)
                                & (idFamilia == 0 ? a.idFamilia != idFamilia : a.idFamilia == idFamilia)
                                & (idSubFamilia == 0 ? a.idSubFamilia != idSubFamilia : a.idSubFamilia == idSubFamilia)
                                & (anio == 0 ? a.fecha.Year != anio: a.fecha.Year == anio)
                                & (mes== 0 ? a.fecha.Month != mes : a.fecha.Month == mes)
                                );
                  
              _count = q.Count();
              return q;




          }


          [DataObjectMethod(DataObjectMethodType.Select, false)]
          public IEnumerable<OrdenCompraItemExcel> Execute(int idInsumo, int startRowIndex, int maximumRows, string sortExpression)
          {
               // ya trae todos las ordenes de compra activas
              var q = ApplySelect_ListInfo();
            
              q = q.Where(a => (emp.GetObraAcceso().Contains(a.idObra))
                            & a.idInsumo == idInsumo);

              _count = q.Count();

              q = ApplySort(q, sortExpression);
              return q.Skip(startRowIndex).Take(maximumRows);

          }


      }

}
